﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Aeroporto.controle;
using Aeroporto.modelo;
using Aeroporto.bd;
using System.Collections;
using Aeroporto.visão;

namespace Aeroporto.visao
{
    public partial class formAgenciaViagem : Form
    {
        private ReservaControl control_reserva = new ReservaControl();
        private ReservaDAO bd_reserva = new ReservaDAO();
        private DisponibilizaControl control_disponibiliza = new DisponibilizaControl();
        private string comp;
        private int grid_ativo;
        private int grid_reservas3;

        public formAgenciaViagem(string agencia)
        {
            InitializeComponent();
            this.comp = agencia;
            
            DataTable dt3 = control_reserva.lista_dados_disponibiliza_codAeronave(comp);
            cb_CodAeronave.DataSource = dt3;
            cb_CodAeronave.DisplayMember = "cod_aeronave";
            
        }
        
        /**
         * Método criado ao carregar o formAgenciaViagem
         **/
        private void formAgenciaViagem_Load(object sender, EventArgs e)
        {
            grid_reservas2.Hide();
            grid_ativo = 1;
            lista_dados();
        }
        
        /**
         * Lista dados no grid
         **/
        private void lista_dados()
        {
            try
            {
                grid_reservas.DataSource = control_reserva.lista_dados_novo("assento", "disponibiliza", "reserva", comp);
                grid_reservas.Sort(grid_reservas.Columns["nome"], ListSortDirection.Ascending);  //ordena dados do grid ascendentemente por cod_reserva
                grid_reservas.Columns["classe"].HeaderText = "Classe";
                grid_reservas.Columns["fila"].HeaderText = "Fila";
                grid_reservas.Columns["numero"].HeaderText = "Número";
                grid_reservas.Columns["cod_aeronave"].HeaderText = "Código Aeronave";
                grid_reservas.Columns["data_viagem"].HeaderText = "Data Viagem";
                grid_reservas.Columns["id_trecho"].HeaderText = "ID Trecho";
                grid_reservas.Columns["cod_reserva"].HeaderText = "Código Reserva";                
                grid_reservas.Columns["nome"].HeaderText = "Nome";              //altera cabeçalho do grid
                grid_reservas.Columns["valor"].HeaderText = "Valor (R$)";       //altera cabeçalho do grid                
                grid_reservas.ReadOnly = true;

                te_classe.ReadOnly = true;
                te_idTrecho.ReadOnly = true;
                te_fila.ReadOnly = true;
                te_numero.ReadOnly = true;
                tb_dataViagem.ReadOnly = true;
            }
            catch (Exception erro)
            {
                MessageBox.Show("Erro na listagem do Grid: " + erro);
            }
        }

        private void lista_dados2()
        {
            try
            {
                grid_reservas2.DataSource = control_reserva.lista_dados_disponibiliza(comp);
                //grid_reservas.Sort(grid_reservas.Columns["nome"], ListSortDirection.Ascending);  //ordena dados do grid ascendentemente por cod_reserva
                grid_reservas2.Columns["classe"].HeaderText = "Classe";
                grid_reservas2.Columns["fila"].HeaderText = "Fila";
                grid_reservas2.Columns["numero"].HeaderText = "Número";
                grid_reservas2.Columns["cod_aeronave"].HeaderText = "Código Aeronave";
                grid_reservas2.Columns["data_viagem"].HeaderText = "Data Viagem";
                grid_reservas2.Columns["id_trecho"].HeaderText = "ID Trecho";
                grid_reservas2.Columns["cod_reserva"].Visible = false;
                grid_reservas2.ReadOnly = true;
                
                te_classe.ReadOnly = true;
                te_idTrecho.ReadOnly = true;
                te_fila.ReadOnly = true;
                te_numero.ReadOnly = true;
                tb_dataViagem.ReadOnly = true;                
                te_codReserva.ReadOnly = true;                
            }
            catch (Exception erro)
            {
                MessageBox.Show("Erro na listagem do Grid: " + erro);
            }
        }

        private void lista_dados3()
        {
            try
            {                                
                Npgsql.NpgsqlDataReader rdr = control_reserva.lista_maxCodReserva();
                while(rdr.Read()){
                    grid_reservas3 =  int.Parse(rdr[0].ToString());
                }
                rdr.Close();
            }
            catch (Exception erro)
            {
                MessageBox.Show("Erro na listagem do Grid: " + erro);
            }
        }

        private void atualiza_campos()
        {
            int linha = grid_reservas.CurrentRow.Index;
            te_fila.Text = grid_reservas[0, linha].Value.ToString();
            te_numero.Text = grid_reservas[1, linha].Value.ToString();
            cb_CodAeronave.Text = grid_reservas[2, linha].Value.ToString();
            te_classe.Text = grid_reservas[3, linha].Value.ToString();
            tb_dataViagem.Text = grid_reservas[4, linha].Value.ToString();
            te_idTrecho.Text = grid_reservas[5, linha].Value.ToString();
            te_codReserva.Text = grid_reservas[8, linha].Value.ToString();  //atualiza o TextEdit de codigo com o valor que está na coluna 0 e na linha "linha" do grid
            te_nome.Text = grid_reservas[6, linha].Value.ToString();
            te_valor.Text = grid_reservas[7, linha].Value.ToString();
        }

        private void atualiza_campos2()
        {
            int linha = grid_reservas2.CurrentRow.Index;            
            te_fila.Text = grid_reservas2[0, linha].Value.ToString();
            te_numero.Text = grid_reservas2[1, linha].Value.ToString();
            cb_CodAeronave.Text = grid_reservas2[2, linha].Value.ToString();
            te_classe.Text = grid_reservas2[5, linha].Value.ToString();
            tb_dataViagem.Text = grid_reservas2[3, linha].Value.ToString();
            te_idTrecho.Text = grid_reservas2[4, linha].Value.ToString();
            te_codReserva.Text = grid_reservas3.ToString();
        }                

        /**
         * Quando o botão Nova reserva é clicado
         */
        private void bu_novo_Click(object sender, EventArgs e)
        {
            MyMessageBox message_box = control_reserva.valida_insert_reserva(te_valor.Text, te_codReserva.Text, te_nome.Text);  //valida e insere dados dos TextEdit's
            MyMessageBox message_box2 = control_disponibiliza.valida_update_disponibiliza(te_fila.Text, te_numero.Text, cb_CodAeronave.Text, tb_dataViagem.Text, te_idTrecho.Text, te_codReserva.Text);
            
            if (message_box2.String2 != "OK.:")
            {
                MessageBox.Show(message_box2.String1, message_box2.String2);            
                return;
            }
            MessageBox.Show(message_box.String1, message_box.String2);
            switch (message_box.String2)    //de acordo com a string2 do MyMessageBox veremos se deu certo, ou não a inserção
            {
                case "Reserva já existente.:":  //se a string2 for "Reserva já existente.:"
                    te_classe.Focus();          //põe o cursor no TextEdit de código
                    la_alerta_codigo.Text = "Código de reserva já existente";           //altera o texto do Label que está na frente do TextEdit para "Código de reserva já existente"
                    break;
                case "OK.:":                    //se a string2 for "OK.:"
                    limpar();                   //limpa o formulário
                    lista_dados();              //lista o grid atualizado
                    grid_reservas2.Hide();
                    grid_reservas.Sort(this.grid_reservas.Columns["cod_reserva"], ListSortDirection.Descending);
                    grid_reservas.Show();
                    
                    break;
            }
        }
        
        /**
         * Método que ouve o evento ocorrido após mudar o texto do TextEdit de código. 
         * Serve para limpar o Label que está na frente dele
         */
        private void te_codigo_TextChanged(object sender, EventArgs e)
        {
            la_alerta_codigo.Text = ""; //limpa o label de alerta de código já existente
        }


        /**
         * Quando o botão Pesquisar é clicado, o DataSource do grid_reservas é alterado
         */
        private void bu_pesquisar_Click(object sender, EventArgs e)
        {
            if (grid_ativo == 2)
            {
                grid_reservas.Hide();
                grid_reservas2.DataSource = control_reserva.pesquisar_nome(comp, te_pesquisa.Text, grid_ativo);

            }
            else if (grid_ativo == 1)
                grid_reservas.DataSource = control_reserva.pesquisar_nome(comp, te_pesquisa.Text, grid_ativo);
        }

        /**
         * Quando o botão excluir é clicado
         * 
         * 
         * 
         * 
         * para poder excluir tenho que fazer o seguinte
         * 
         * 
         * update disponibiliza set cod_reserva = null where cod_reserva = 99;
         * update auditoria_reservas set cod_reserva_atual = null where cod_reserva_atual = 99;
         * select * from disponibiliza order by cod_reserva asc;
         *
         * delete from reserva where cod_reserva = 99;
         */
        private void bu_excluir_Click(object sender, EventArgs e)
        {
            if (te_codReserva.Text == "" && te_nome.Text == "" || te_valor.Text == "")
            {  //verifica se os campos dos TextEdit's não estão preenchidos
                MessageBox.Show("Selecione uma reserva na tabela de reservas para excluir", "Atenção.:"); //se não estão, mensagem de Atenção é exibida
                return;
            }

            /*ArrayList chaves_primarias = new ArrayList();
            //se os campos estão preenchidos
            foreach (DataGridViewRow r in grid_reservas.SelectedRows)//pega as linhas selecionadas
            {
                chaves_primarias.Add(r.Cells[8].Value.ToString());//a PK está na célula 8
            }*/
            int chaves_primarias = int.Parse(te_codReserva.Text.ToString());

            if (MessageBox.Show("Tem certeza que deseja excluir a reserva " + chaves_primarias+ "?", "Reserva", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)//exibe mensagem para confirmar exclusão
            {
                MyMessageBox message_box = control_reserva.exclui_reserva(chaves_primarias);  //exclui a reserva cujo o código está no TextEdit de código
                //fazer o update em disponibiliza para tirar a cod_reserva:
                //MyMessageBox message_box2 = contro
                MessageBox.Show(message_box.String1, message_box.String2);                    //mostra mensagem se excluiu ou não
                lista_dados();                                                                //atualiza os dados do grid
                limpar();
            }
        }

        /**
         * Quando o botão limpar é clicado, limpamos os TextEdit's
         */
        private void button1_Click(object sender, EventArgs e)
        {
            limpar();
        }

        /**
         * Limpa os TextEdit's
         */
        private void limpar()
        {
            te_classe.Text = "";
            te_nome.Text = "";
            te_valor.Text = "";
            te_pesquisa.Text = "";
            cb_CodAeronave.Text = "";
            te_fila.Text = "";
            te_numero.Text = "";
            tb_dataViagem.Text = "";
            te_idTrecho.Text = "";
            te_codReserva.Text = "";
        }

        /**
         * Quando o botão alterar é clicado
         */
        private void bu_alterar_Click(object sender, EventArgs e)
        {
            string chave_primaria_antiga = grid_reservas[8, grid_reservas.CurrentCell.RowIndex].Value.ToString();   //pegamos a chave primária antiga que se encontra no grid, pois, precisamos verificar se a chave primária foi alterada
            MyMessageBox message_box = control_reserva.valida_update_reserva(te_valor.Text, te_codReserva.Text, te_nome.Text);//valida e atualiza os dados da reserva
            MessageBox.Show(message_box.String1, message_box.String2);//exibe mensagem dizendo se foi ou não atualizado os dados
            if(message_box.String2=="OK.:")
                lista_dados();//atualiza os dados do grid
        }

        /**
         * Quando o botão atualizar é clicado, atualiza os dados do grid
         */
        private void bu_atualizar_Click(object sender, EventArgs e)
        {
            la_tabela.Text = "Tabela de reservas já realizadas";
            grid_reservas2.Hide();
            grid_reservas.Show();            
            grid_ativo = 1;
            lista_dados();
        }

        private void formAgenciaViagem_FormClosed(object sender, FormClosedEventArgs e)
        {
            if(comp == "AGENCIA")
                Application.Exit();
        }

        private void grid_reservas_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            atualiza_campos();
        }
 
        private void bt_disponibiliza_Click(object sender, EventArgs e)
        {
            grid_ativo = 2;
            la_tabela.Text = "Tabela de reservas disponíveis";            
            grid_reservas.Hide();
            grid_reservas2.Show();

            lista_dados2();
            lista_dados3();            
        }

        private void grid_reservas2_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            atualiza_campos2();
            te_nome.Text = te_valor.Text = "";

        }

        private void te_pesquisa_KeyPress(object sender, KeyPressEventArgs e)
        {
            if(e.KeyChar == 13)
                bu_pesquisar_Click(sender, e);
        }
        
        private void button1_MouseEnter(object sender, EventArgs e)
        {
            label9.Text = "Não sei o trecho.";
        }

        private void button1_MouseLeave_1(object sender, EventArgs e)
        {
            label9.Text = "";
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            formPesquisaTrecho form = new formPesquisaTrecho();
            form.Show();
        }

        private void bu_cancelar_Click(object sender, EventArgs e)
        {
            if (te_codReserva.Text == "")
            {
                MessageBox.Show("Número da reserva não informado. Dê um duplo clique na reserva a ser cancelada.", "Erro.:");
            }
            else
            {
                if (MessageBox.Show("Tem certeza que deseja cancelar a reserva Nº "+te_codReserva.Text + "?", "Reserva", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)//exibe mensagem para confirmar exclusão
                {
                    control_reserva.cancela_reserva(te_codReserva.Text);
                    MessageBox.Show("Reserva cancelada.", "OK.:");
                    lista_dados();
                }
            }
        }
        
        private void cb_CodAeronave_SelectedValueChanged(object sender, EventArgs e)
        {
             
        }
        
    }
}

